"""
自定义文件存储后端，来构造完整的图片url返回
"""

# Storage默认的文件存储后端
from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client
import os
from rest_framework import serializers

class FastDFSStorage(Storage):

    def __init__(self, fdfs_base_url=None):
        self.fdfs_base_url = fdfs_base_url or settings.FDFS_BASE_URL

    # Django项目二中实现用于图片上传
    def _open(self, name, mode='rb'):
        # 用于打开django本地文件作本地保存使用的，我们此处实现上传fdfs，所以无需打开本地文件
        pass

    def _save(self, name, file, max_length=None):
        # name是文件名称；file文件对象

        config_path = os.path.join(settings.BASE_DIR, 'utils/client.conf')
        conn = Fdfs_client(config_path)

        ret = conn.upload_by_buffer(file.read())
        if not (ret and ret['Status'] == 'Upload successed.'):
            # 上传失败
            raise serializers.ValidationError('fdfs上传图片失败')

        file_id = ret['Remote file_id']

        # _save方法返回的结果，就是ImageField类型字段存储在mysql中的结果
        return file_id


    def exists(self, name):
        # 功能：判断django本地是否已经存在该文件,避免重复保存
        # 此处我们是吧图片数据上传远程fdfs，故，无需判定是否存在
        return False # 返回False表明，本地图片不存在，直接调用_save方法实现上传

    # 构造完整链接返回给浏览器用于访问图片
    def url(self, name):
        """
        功能：构建完整的图片文件url
        :param name: mysql中存储的文件索引id，比如：group1/M00/00/02/CtM3BVrPB4GAWkTlAAGuN6wB9fU4220429
        :return: 完整的图片url
        """
        return self.fdfs_base_url + name